package com.frame.util;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/*******************************************
 * 作用描述：验证码图片生成工具类
 *******************************************
 * @author LRC
 * @createDate 2015-9-11
 * @version v1.0
 * @updateRecord 时间，作者，修改说明：
 *******************************************
 * 
 */
public class ValidateCodeImageUtil {
	private static final int WIDTH=55;//图片的宽度
	private static final int HEIGHT=25;//图片的高度
	private static final int STARTX=5;//开始绘制验证码文字的起始位置 X Y
	private static final int STARTY=15;
	private static final int FONT_SIZE=15;//文字的尺寸
	private static final int FONT_STYLE=Font.BOLD;//文字的字体格式
	private static final int CODE_NUM=4;//文字的个数
	private static final int CHANGE_Y=9;//绘制文件高度的随机变化幅度
	private static final int SPACE=12;//文字直接的间隔
	
	/*******************************************
	 * 功能描述：生成验证码图片对象
	 *******************************************
	 * @createDate 2015-9-11 by LRC
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static Map<String, BufferedImage> createImage(){
		//创建图片对象
		BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
		//获取图片画笔
		Graphics2D gps = (Graphics2D) image.getGraphics();
		//绘制图片白底黑框
		gps.setColor(Color.WHITE);
		gps.fillRect(0, 0, WIDTH, HEIGHT);
		gps.setColor(Color.BLACK);
		gps.drawRect(0, 0, WIDTH-1, HEIGHT-1);
		
		//生成随机校验码 A-Z 0-9 共36个字符
		Random rd = new Random();
		char[] codes = new char[CODE_NUM];
		for(int i=0; i<CODE_NUM; i++){
			int code = rd.nextInt(36);
			if(code<26){
				codes[i] = (char) ('A'+code);
			}else{
				codes[i] = (char) ('0' + (code-26));
			}
		}
		
		//绘制校验码
		gps.setFont(new Font(null,FONT_STYLE,FONT_SIZE));
		for(int i=0; i<CODE_NUM; i++){
			//设置画笔颜色
			gps.setColor(new Color(rd.nextInt(255),rd.nextInt(255),rd.nextInt(255)));
			//绘图
			gps.drawString(codes[i]+"", STARTX+i*SPACE, STARTY+rd.nextInt(CHANGE_Y));
		}
		
		Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();
		map.put(new String(codes), image);
		
		return map;
	}
	
	/*******************************************
	 * 功能描述：获取图片输入流
	 *******************************************
	 * @createDate 2015-9-11 by LRC
	 * @param image
	 * @return 
	 * @throws ImageFormatException
	 * @throws IOException 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static InputStream getJPEGInputStream(BufferedImage image) throws ImageFormatException, IOException{
		if(image == null)
			return null;
		// 创建缓冲字节数组输出流
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		// 获取图片压缩格式
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
		// 压缩图片
		encoder.encode(image);
		// 获取输出流字节数组
		byte[] data = bos.toByteArray();
		// 构建输入流对象
		return new ByteArrayInputStream(data);
	}
	
	/*******************************************
	 * 功能描述：获取指定格式的图片输入流
	 *******************************************
	 * @createDate 2015-9-11 by LRC
	 * @param image 图片文件流
	 * @param formatName 图片文件格式 JPEG JPG GIF
	 * @return 
	 * @throws IOException
	 * @updateRecord 时间，作者，修改说明：
	 *******************************************
	 * 
	 */
	public static InputStream getInputStream(BufferedImage image, String formatName) throws IOException{
		if(image == null)
			return null;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		
		ImageIO.write(image, formatName, bos);
		
		byte[] data = bos.toByteArray();
		
		return new ByteArrayInputStream(data);
	}
}
